package com.wlz.java8.lambda;
import com.wlz.basic.serializable.Student;
import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author： wlz
 * @Date 2020/7/6 9:38
 * @description： TODO
 * @version: 1.0
 *  方法引用和对象引用
 *  若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用"
 *  可以理解为方法引用是Lambda表达式的另外一种表现形式
 *
 */
public class Demo5 {

    /**
     * 对象::实例方法名
     */
    @Test
    public void test1() {
//        Consumer<String> consumer = x-> System.out.println(x);
        PrintStream printStream = System.out;
        // 要注意的是接口的抽象方法的形参表、返回类型需要和调用的类方法形参表 返回类型保持一致
        Consumer consumer = System.out::println;
        consumer.accept("123456");
    }

    /**
     * 类::静态方法名
     */
    @Test
    public void test2() {
        //要注意的是接口的抽象方法的形参表、返回类型需要和调用的类方法形参表 返回类型保持一致
        Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
        Comparator<Integer> com2 = Integer::compare;
    }


    /**
     * 类::实例方法名
     */
    @Test
    public void test3() {
        // 需求:比较两个字符串是否相等
        // 要求:第一个参数是实例方法的调用者，第二个参数是方法的传入参数时
        BiPredicate<String, String> biPredicate = (x,y) -> x.equals(y);
        BiPredicate<String, String> bi = String::equals;
    }

    /**
     *  构造器引用
     */
    @Test
    public void test4() {
        Supplier<Student> s = Student::new;
        Function<Integer, Student> st = Student::new;
    }


}
